## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.6 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.1.0 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
##
## Attaching package: 'summarytools'
## The following object is masked from 'package:tibble':
##
## view
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
La base de datos que se va a emplear para proyectar el número de vehículos a registrar en el Registro Único Nacional de Tránsito, RUNT contiene un registro del número de vehículos que han sido registrados diariamente entre el primero de enero de 2012 (2012-01-01) y el 31 de diciembre de 2017 (2017-12-31), lo que implica que parte con solo dos variables: la fecha y el número de vehículos registrados en el RUNT en cada fecha, con 2,192 observaciones que abarcan la totalidad de días que transcurrieron entre las dos fechas límite. Con esto claro, se desarrolla la siguiente serie de tiempo que ilustra el número de vehículos registrados por día.
## Rows: 2,192
## Columns: 2
## $ Fecha <dttm> 2012-01-01, 2012-01-02, 2012-01-03, 2012-01-04, 2012-01-05, ~
## $ Unidades <dbl> 0, 188, 482, 927, 1159, 996, 243, 0, 0, 697, 956, 1001, 1170,~
De este gráfico se pueden destacar varias cosas. La primera de ellas es que la venta de vehículos presenta con bastante frecuencias días con cero registros nuevos, aspecto que se indagará más adelante. Asimismo, parece que las ventas medias se preservan en la mayor parte del año, con un pequeño pico al finalizar el primer trimestre y otro más destacado finalizando el año. Asimismo, se puede ver que el número de vehículos registrados en el RUNT parece tener un decenso a partir del año 2016, pues antes de este año es frecuente que se superasen los mil carros registrados por día, toda vez que a partir de este año esto pasa a ser menos frecuente. Así, considerando estos datos, se obtienen los siguientes resúmenes numéricos para el número de vehículos registrado por día:
| Parámetro | Valor |
|---|---|
| Media | 782.17 |
| Desviación estándar | 551.16 |
| Mínimo | 0 |
| Primer cuantil (Q1) | 293 |
| Mediana (Q2) | 865.5 |
| Tercer cuantil (Q3) | 1,173 |
| Máximo (Q4) | 3,603 |
| Rango intercuartídico | 880 |
| Coeficiente de variación | 0.7 |
| Coeficiente de asimetría | 0.05 |
| Curtosis | 0.35 |
Como se observa, cada día entre los años 2012 y 2017 (inclusive) se registraron 782.17 vehículos en el RUNT en promedio, con una desviación estándar de 551.16 vehículos por día, y presentando un mínimo en cero vehículos por día (lo cual sucede durante varios días como se podrá verificar más adelante), y un máximo de 3,603 vehículos, lo cual ocurrió el 29 de diciembre del 2016. Además, se tiene que la mediana se da en 865.5 vehículos, lo que quiere decir que en al menos la mitad de los días del periodo mencionado se registraron 366 vehículos o más, y en el resto de días 365 vehículos o menos. Por último, se debe destacar que el coeficiente de variación es de 0.7 (70%), lo que muestra que el promedio no es representativo del conjunto de datos; asimismo, el coeficiente de asimetría es de 0.05, lo cual muestra que los datos están concentrados hacia el promedio de 782.17 vehículos registrados por día en el RUNT, pero con una ligera tendencia hacia un menor número de registros diarios, toda vez que la curtosis de 0.35, lo que implica que la distribución presenta una menor cantidad de datos atípicos comparado con una distribución normal y una mayor concentración alrededor de su media. Esto se ilustra bien mediante el siguiente gráfico:
Como se aprecia, lo más frecuente es que en un día se inscriban en el RUNT entre cero y 124 vehpiculos aproximadamente, ya que esto sucedió en 422 de los 2,192 días que abarca el periodo de interés, seguido por entre 746 y 870 vehículos por día, pues en 239 días se registraron un número de vehículos incluido en tal intervalo. De la misma forma, destaca el hecho de que hay pocos días que tengan dos mil o más vehículos registrados por día.
Ahora bien, con el objetivo de entender mejor la dinámica de venta de vehículos, vale la pena observar el comportamiento por mes, año, semana y día de la semana, para lo cual se van a crear tales variables auxiliares con ayuda de \(\color{blue}{\textsf{R}}\), lo cual deja la estructura de la base de datos como sigue:
## Rows: 2,192
## Columns: 7
## $ Fecha <date> 2012-01-01, 2012-01-02, 2012-01-03, 2012-01-04, 2012-01-05~
## $ Unidades <dbl> 0, 188, 482, 927, 1159, 996, 243, 0, 0, 697, 956, 1001, 117~
## $ dia <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ~
## $ mes <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ anno <dbl> 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,~
## $ dia_semana <dbl> 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,~
## $ semana <dbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,~
Y con esto, se va a revisar el comportamiento por mes entre el 2012 y el 2017 (inclusive) del registro de vehículos en el RUNT mediante la siguiente serie de tiempo:
## `summarise()` has grouped output by 'anno'. You can override using the `.groups` argument.
## List of 93
## $ line :List of 6
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype : num 1
## ..$ lineend : chr "butt"
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 5
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype : num 1
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 11
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 11
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight : num 0.9
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ title : NULL
## $ aspect.ratio : NULL
## $ axis.title : NULL
## $ axis.title.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.x.bottom : NULL
## $ axis.title.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y.left : NULL
## $ axis.title.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey30"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.top :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 0
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x.bottom : NULL
## $ axis.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y.left : NULL
## $ axis.text.y.right :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks :List of 6
## ..$ colour : chr "grey70"
## ..$ size : 'rel' num 0.5
## ..$ linetype : NULL
## ..$ lineend : NULL
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ axis.ticks.x : NULL
## $ axis.ticks.x.top : NULL
## $ axis.ticks.x.bottom : NULL
## $ axis.ticks.y : NULL
## $ axis.ticks.y.left : NULL
## $ axis.ticks.y.right : NULL
## $ axis.ticks.length : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ axis.ticks.length.x : NULL
## $ axis.ticks.length.x.top : NULL
## $ axis.ticks.length.x.bottom: NULL
## $ axis.ticks.length.y : NULL
## $ axis.ticks.length.y.left : NULL
## $ axis.ticks.length.y.right : NULL
## $ axis.line : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.x : NULL
## $ axis.line.x.top : NULL
## $ axis.line.x.bottom : NULL
## $ axis.line.y : NULL
## $ axis.line.y.left : NULL
## $ axis.line.y.right : NULL
## $ legend.background :List of 5
## ..$ fill : NULL
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ legend.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ legend.spacing.x : NULL
## $ legend.spacing.y : NULL
## $ legend.key :List of 5
## ..$ fill : chr "white"
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ legend.key.size : 'simpleUnit' num 1.2lines
## ..- attr(*, "unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.align : NULL
## $ legend.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.align : NULL
## $ legend.position : chr "right"
## $ legend.direction : NULL
## $ legend.justification : chr "center"
## $ legend.box : NULL
## $ legend.box.just : NULL
## $ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
## ..- attr(*, "unit")= int 1
## $ legend.box.background : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ legend.box.spacing : 'simpleUnit' num 11points
## ..- attr(*, "unit")= int 8
## $ panel.background :List of 5
## ..$ fill : chr "white"
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ panel.border :List of 5
## ..$ fill : logi NA
## ..$ colour : chr "grey70"
## ..$ size : 'rel' num 1
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ panel.spacing : 'simpleUnit' num 5.5points
## ..- attr(*, "unit")= int 8
## $ panel.spacing.x : NULL
## $ panel.spacing.y : NULL
## $ panel.grid :List of 6
## ..$ colour : chr "grey87"
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ lineend : NULL
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ panel.grid.major :List of 6
## ..$ colour : NULL
## ..$ size : 'rel' num 0.5
## ..$ linetype : NULL
## ..$ lineend : NULL
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ panel.grid.minor :List of 6
## ..$ colour : NULL
## ..$ size : 'rel' num 0.25
## ..$ linetype : NULL
## ..$ lineend : NULL
## ..$ arrow : logi FALSE
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ panel.grid.major.x : NULL
## $ panel.grid.major.y : NULL
## $ panel.grid.minor.x : NULL
## $ panel.grid.minor.y : NULL
## $ panel.ontop : logi FALSE
## $ plot.background :List of 5
## ..$ fill : NULL
## ..$ colour : chr "white"
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ plot.title :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 1.2
## ..$ hjust : num 0
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 5.5points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ plot.title.position : chr "panel"
## $ plot.subtitle :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 0points 0points 5.5points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ plot.caption :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 0.8
## ..$ hjust : num 1
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 5.5points 0points 0points 0points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ plot.caption.position : chr "panel"
## $ plot.tag :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : 'rel' num 1.2
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ plot.tag.position : chr "topleft"
## $ plot.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
## ..- attr(*, "unit")= int 8
## $ strip.background :List of 5
## ..$ fill : chr "grey70"
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ strip.background.x : NULL
## $ strip.background.y : NULL
## $ strip.placement : chr "inside"
## $ strip.text :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "white"
## ..$ size : 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
## .. ..- attr(*, "unit")= int 8
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ strip.text.x : NULL
## $ strip.text.y :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : num -90
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ strip.switch.pad.grid : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ strip.switch.pad.wrap : 'simpleUnit' num 2.75points
## ..- attr(*, "unit")= int 8
## $ strip.text.y.left :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : num 90
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi TRUE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUE
Y como se puede observar, no se puede hablar de que haya una cantidad semejante de vehículos vendidos por mes, ya que en cada año se puede observar que hay una tendencia a la baja al iniciar en el año, pues en cada uno de los meses de enero hay un mínimo de vehículos registrados en el RUNT para sus respectivos años, ocurriendo luego un incremento hacia los meses de marzo, abril y mayo para mantenerse en niveles semejantes hasta que se presenta un máximo en el mes de diciembre, siendo el más destacado el del año 2014, ya que en dicho diciembre se registraron 40,518 vehículos. Así mismo, se evidencia nuevamente una tendencia bajista en el comportamiento global, ya que hay un menor número de registros hacia los años 2018 y 2017 comparado con los demás, siendo 2014 el año con mejores registros, como se verá más adelante. Ahora, se va a analizar el número de vehículos registrados por mes sin importar el año.
Y se observa algo que fue confirmado previamente y es que diciembre es el mes con más registros diarios en el RUNT, toda vez que enero es el que menos. Asimismo, se observa que en el resto de meses se estabiliza aproximadamente el registro con al menos de 15,000 registros por mes, siendo febrero y una excepción probablemente por una recuperación luego del mínimo de enero.
Con el fin de generar un modelo de predicción de vehículos registrados en el RUNT durante en el 2018, se van a crear algunas variables adicionales que podrían incidir positivamente en la forma en la que los diferentes modelos a plantear trabajar. Se debe tener en cuenta que lo buenas que resulten dichas variables solo será descubierto una vez se generen los diferentes modelos.
Colombia es un país con un débil aparato productivo de vehículos, lo cual se refleja en que en el 2019 se produjeron solo 127,541 vehículos en Colombia (lo cual resulta bajo comparado con los más de 3.9 millones de vehículos fabricados en México) y que contraste con los 223,755 vehículos de uso particular que fueron vendidos en el país durante el mismo año [1]. En ese sentido, es fundamental para abastecer la demanda de vehículos del país buscar en los mercados internacionales tales vehículos, y así, teniendo en cuenta que estas operaciones se tranzan generalmente dólares estadounidenses (USD), se puede considerar el precio de esta divisa en cada día, para lo cual resulta útil consultar el histórico de la tasa representativa del mercado (TRM) calculado por el Banco de la República al final de cada día [2].
Para poder identificar patrones estacionarios y otros asociados con el tiempo, se van a crear las siguientes variables:
La mayoría de puntos del país donde es posible realizar un registro al RUNT solo operan en días laborales, es decir, entre el lunes y el sábado de cada semana, con la excepción de aquellos días que sean festivos, por lo que es importante identificar dichos días para que el modelo pueda incorporarlos y trabajar con ellos. Nótese que es de utilidad tener en consideración los días festivos y los domingos simultáneamente en una sola variable, ya que tenerlas separadas podría implicar una redundancia.
A continuación se van a implentar diferentes técnicas de aprendizaje automático para realizar regresiones que permitan predecir la cantidad de vehículos que van a ser registrados diariamente en el RUNT. En la mayoría de ellos se va a apelar al paquete \(\color{purple}{\texttt{caret}}\) del software de programación especializado en estadística \(\color{blue}{\textsf{R}}\), el cual permite de forma sencilla implementar los diferentes modelos y verificarlos usando cross validation, que, en particular, será aplicado empleando diez iteraciones.
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
##
## Call:
## lm(formula = Unidades ~ ., data = db, subset = -ind.vl)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1476.42 -236.47 10.07 205.34 2365.35
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.272e+04 2.507e+04 2.103 0.035603 *
## dia -3.862e+00 4.388e+00 -0.880 0.378828
## mes -4.847e+02 1.301e+02 -3.724 0.000202 ***
## anno -2.600e+01 1.249e+01 -2.081 0.037546 *
## dia_semana -5.424e+01 5.631e+00 -9.632 < 2e-16 ***
## semana 1.158e+02 2.994e+01 3.868 0.000114 ***
## TRM -5.307e-02 3.919e-02 -1.354 0.175874
## Laboral 1.132e+03 2.874e+01 39.379 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 363.5 on 1636 degrees of freedom
## Multiple R-squared: 0.5682, Adjusted R-squared: 0.5663
## F-statistic: 307.5 on 7 and 1636 DF, p-value: < 2.2e-16
Como se puede observar, el valor del \(R^2\) que se obtiene para este modelo es de \(R^2 = 0.5682\), y la versión ajustada es \(R^2_{adj} = 0.5663\), los cuales son valores regulares que van a tratar de ser mejorados de cara al modelo que finalmente sea empleado. Sin embargo, debe tenerse en cuenta que la regres
Se va a emplear el método de los k vecinos más cercanos, conocido como KNN por sus siglas en inglés (k nearest neighbors), y esto será realizado en dos etapas: la primera de ellas ignorando el preprocesamiento, es decir, usando los datos puros sin ninguna especie de modificación y luego preprocesándolos, lo cual implica que se los va a ajustar de acuerdo a sus medias y varianzas.
## k-Nearest Neighbors
##
## 2192 samples
## 7 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1972, 1972, 1972, 1973, 1974, 1974, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 5 549.7380 0.07118280 445.5994
## 7 551.7919 0.05728017 450.5152
## 9 547.5985 0.05481618 450.6303
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.
Y como se puede ver, para tres valores diferentes del número de vecinos a considerar, se obtienes valores de \(R^2\) bastante bajos, lo cual impide que las variables regresoras consideradas sean útiles para explicar la variabilidad de la variable unidades, que es la que quiere ser predicha para cada día del 2018, lo cual lleva a que este modelo sea descartado inmediatamente.
## k-Nearest Neighbors
##
## 2192 samples
## 7 predictor
##
## Pre-processing: centered (7), scaled (7)
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1973, 1974, 1973, 1974, 1972, 1972, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 5 235.9529 0.8206710 151.5282
## 7 244.7898 0.8080335 159.8338
## 9 249.0958 0.8016481 162.3423
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 5.
Y se evidencia una notable mejoría que en el caso en el que el preprocesamiento no fue realizado, pues para cada una de las tres iteraciones evaluadas (\(k = 5, \ 7, \ 9\)), se obtuvieron valores de \(R^2\) de al menos \(0.80\), lo cual es bueno. Sin embargo, es interesante evaluar si es posible mejorar estos valores al ensayar aún más iteraciones, para lo cual se generará un grilla que posibilite evaluar valores de \(k\) entre uno y cien.
## k-Nearest Neighbors
##
## 2192 samples
## 7 predictor
##
## Pre-processing: centered (7), scaled (7)
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1974, 1973, 1972, 1973, 1972, 1974, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 1 364.9012 0.6147823 221.9877
## 2 294.5513 0.7167016 191.8319
## 3 253.6985 0.7896485 161.0203
## 4 239.4396 0.8146969 151.3786
## 5 239.8894 0.8146820 152.3340
## 6 242.8743 0.8107085 154.3526
## 7 250.1736 0.7992315 160.4548
## 8 251.5742 0.7977750 161.1521
## 9 252.0921 0.7973813 162.1631
## 10 255.0247 0.7927626 163.2096
## 11 256.2165 0.7911563 163.9221
## 12 257.5579 0.7891872 165.1572
## 13 259.2458 0.7865080 166.1804
## 14 259.8765 0.7856286 166.7189
## 15 261.7247 0.7829232 167.7644
## 16 263.7267 0.7795008 169.7157
## 17 265.7980 0.7759884 171.2040
## 18 266.7527 0.7744520 172.4687
## 19 269.7380 0.7693160 174.6506
## 20 271.3869 0.7664559 175.8664
## 21 272.6526 0.7642889 177.2821
## 22 273.8698 0.7623410 178.5116
## 23 276.5495 0.7573042 180.6588
## 24 278.4118 0.7539448 182.2191
## 25 280.5980 0.7498046 184.1503
## 26 282.6332 0.7459321 185.5769
## 27 284.7254 0.7419718 187.0444
## 28 286.0058 0.7395977 188.3449
## 29 287.2847 0.7371309 189.5863
## 30 288.6297 0.7345423 190.7035
## 31 289.6247 0.7325769 191.3937
## 32 290.5061 0.7308618 192.2988
## 33 291.4238 0.7290265 192.9013
## 34 292.4923 0.7270481 193.8316
## 35 293.7416 0.7245328 194.6898
## 36 294.8417 0.7223872 195.4745
## 37 296.2751 0.7195671 196.5643
## 38 296.9895 0.7181829 197.1730
## 39 298.1332 0.7157678 197.8629
## 40 298.4212 0.7152313 198.2815
## 41 299.4070 0.7132670 199.0347
## 42 300.3155 0.7114865 199.6131
## 43 300.9991 0.7101131 200.2246
## 44 301.6631 0.7087567 200.6571
## 45 302.5101 0.7070668 201.3817
## 46 303.1753 0.7056962 201.7712
## 47 303.5462 0.7050158 202.1197
## 48 304.6728 0.7027022 202.9523
## 49 305.6037 0.7007749 203.6935
## 50 306.1753 0.6996739 204.2133
## 51 307.0041 0.6979600 204.8573
## 52 307.6170 0.6967378 205.3007
## 53 308.5535 0.6948285 206.0160
## 54 309.5084 0.6928145 206.4578
## 55 310.1746 0.6913417 206.9392
## 56 310.4974 0.6906596 207.1171
## 57 311.0373 0.6896012 207.6448
## 58 311.5888 0.6884889 208.0582
## 59 312.0377 0.6875224 208.2781
## 60 312.3928 0.6868416 208.5496
## 61 313.2718 0.6850254 209.1972
## 62 313.8122 0.6838720 209.6043
## 63 314.3966 0.6826546 210.0531
## 64 315.0505 0.6813162 210.4322
## 65 315.8836 0.6795859 211.0887
## 66 316.2482 0.6788436 211.2581
## 67 316.8568 0.6776138 211.7487
## 68 317.3074 0.6766632 212.1710
## 69 317.9948 0.6751975 212.6184
## 70 318.6713 0.6738046 213.2127
## 71 319.0337 0.6730424 213.5417
## 72 319.6610 0.6717222 214.1211
## 73 320.4121 0.6700845 214.5604
## 74 320.8975 0.6690891 214.8927
## 75 321.4415 0.6679196 215.3304
## 76 321.7843 0.6672472 215.5780
## 77 322.3344 0.6660952 215.9835
## 78 322.8712 0.6649224 216.4915
## 79 323.2004 0.6642455 216.8232
## 80 323.6102 0.6633839 217.3017
## 81 324.0839 0.6624108 217.8333
## 82 324.5861 0.6613398 218.3487
## 83 325.0923 0.6602986 218.7960
## 84 325.5854 0.6592375 219.1625
## 85 325.9174 0.6585920 219.5421
## 86 326.1745 0.6580900 219.7940
## 87 326.6130 0.6572084 220.1208
## 88 327.2064 0.6559197 220.6473
## 89 327.5536 0.6552278 220.8923
## 90 327.8561 0.6546368 221.1850
## 91 328.4176 0.6534406 221.6388
## 92 329.1359 0.6518701 222.1813
## 93 329.3746 0.6514676 222.5226
## 94 329.7045 0.6507883 222.8152
## 95 330.2199 0.6496984 223.2702
## 96 330.6807 0.6487372 223.6576
## 97 331.1840 0.6477070 224.2317
## 98 331.5465 0.6469509 224.6680
## 99 331.8661 0.6463250 224.9462
## 100 332.3791 0.6452812 225.4051
## 101 332.9560 0.6440914 225.8677
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 4.
Y como se puede observar en la tabla anterior, los mejores valores para el número de vecinos a considerar, basados en el \(R^2\) son \(k = 4\) y \(k = 5\), pues hay un empate con esta métrica. No obstante, al considerar las otras dos métricas: RMSE y MSE, los cuales entre más bajos mejores son, se determina que el número óptimo de vecinos a considerar es \(k = 4\). A continuación se observa un gráfico que permite visualizar el valor de la raíz del error cuádratico medio como función del número de vecinos empleado.
## CART
##
## 2192 samples
## 7 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1972, 1972, 1973, 1973, 1974, 1972, ...
## Resampling results across tuning parameters:
##
## maxdepth RMSE Rsquared MAE
## 1 401.2074 0.4699951 275.7741
## 2 307.1483 0.6894374 195.6781
## 3 285.9566 0.7316715 187.8941
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was maxdepth = 3.
Ahora bien, al implementar árboles de decisión, se evidencia que el valor del \(R^2\) varía notablemente según la profundidad máxima permitida, mejorando progresivamente al evaluar entre uno y tres (inclusive) nodos, alcanzando un pico \(R^2 = 0.7317\) cuando se consideran tres nodos como máximo. No obstante, para poder tener una mejor panorámica del alcance de este modelo, se va a generar una grilla que permita evaluar más modelos con árboles de decisión para así escoger el número óptimo de profundidad máxima permitida.
## CART
##
## 2192 samples
## 7 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1974, 1973, 1973, 1973, 1973, 1972, ...
## Resampling results across tuning parameters:
##
## maxdepth RMSE Rsquared MAE
## 1 401.9204 0.4680477 275.7957
## 2 307.9308 0.6881483 195.7286
## 3 284.8798 0.7340180 186.9455
## 4 266.7102 0.7666940 174.6776
## 5 249.7927 0.7954650 156.7890
## 6 237.1811 0.8156399 145.4569
## 7 242.4209 0.8071233 146.2552
## 8 242.4209 0.8071233 146.2552
## 9 242.4209 0.8071233 146.2552
## 10 242.4209 0.8071233 146.2552
## 11 242.4209 0.8071233 146.2552
## 12 242.4209 0.8071233 146.2552
## 13 242.4209 0.8071233 146.2552
## 14 242.4209 0.8071233 146.2552
## 15 242.4209 0.8071233 146.2552
## 16 242.4209 0.8071233 146.2552
## 17 242.4209 0.8071233 146.2552
## 18 242.4209 0.8071233 146.2552
## 19 242.4209 0.8071233 146.2552
## 20 242.4209 0.8071233 146.2552
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was maxdepth = 6.
Y se observa que el mejor modelo es aquel que considera una profundida máxima de seis, puesto que su \(R^2 = 0.8156\). Empero, este modelo no va a poder ser finalmente evaluado teniendo en cuenta que no es bueno para poder hacer predicciones fuera de su rango de generación, lo que quiere decir en este caso que sería bastante bueno para poder predecir cuál es la cantidad de vehículos registrados en el RUNT para días faltantes entre el 2012 y el 2017, pero no para evaluar más allá de estos años, lo que quiere decir que proyectar valores para el 2018 no va a ser útil con este método.
[1] PROCOLOMBIA. “Industria automotriz en Colombia”. Procolombia. https://www.colombiatrade.com.co/noticias/industria-automotriz-en-colombia (accedido el 8 de enero de 2022).
[2] Banco de la República de Colombia. “Tasa representativa del mercado (TRM - peso por dólar)”. Banco de la República. https://www.banrep.gov.co/es/estadisticas/trm (accedido el 8 de enero de 2022).